/*
 * @Description:
 * @Author: 小雨
 * @Date: 2024-07-02 14:58:26
 * @LastEditTime: 2024-07-02 15:36:15
 * @LastEditors: 小雨
 */
const express = require('express');
const jsonwebtoken = require('jsonwebtoken');
const expressJWT = require('express-jwt');

const app = express();

app.use(express.urlencoded({ extended: false }));

//定义secret秘钥  建议给秘钥命名为secretKey
const secretKey = 'xixi love - -';

//注册将jwt字符串解析还原成json对象的中间件  unless是指不需要jwt接口
//只要成功配置成功express-jwt这个中间件，就可以吧解析出来的用户信息挂载 req.auth中
app.use(expressJWT.expressjwt({ secret: secretKey, algorithms: ['HS256'] }).unless({ path: [/\/api\//] }));

app.post('/api/login', (req, res) => {
    if (req.body.username !== 'admin' && req.body.password != '111') {
        return res.send({
            msg: '登录失败',
            status: 400,
        });
    }
    //参数一：用户信息对象
    //参数二：加密秘钥
    //参数三:配置对象 比如有效期
    //记住不要密码加密
    const tokenStr = jsonwebtoken.sign({ username: req.body.username }, secretKey, { expiresIn: '30s' });
    res.send({
        status: 200,
        message: '登录成功',
        token: tokenStr,
    });
});

app.get('/admin/getInfo', (req, res) => {
    //使用req.auth获取用户信息
    res.send({
        status: 200,
        message: '登录成功',
        data: req.auth,
    });
});

//全局错误中间件  捕获jwt失败后产生的错误  需要放在路径最后面
app.use((err, req, res, next) => {
    if (err.name === 'UnauthorizedError') {
        return res.send({
            status: 401,
            message: 'token过期',
        });
    }
    return res.send({
        status: 500,
        message: '服务器异常',
        data: err,
    });
});

app.listen(80, () => {
    console.log('服务器启动');
});
